/*
 * @Description: TS基础
 * @notes: 
 * @Author: 台火山
 * @Date: 2024-03-08 19:23:17
 * @LastEditors: 台火山
 * @LastEditTime: 2024-03-08 22:08:25
 */

export { }
// 字面量

// 也可以直接使用字面量进行类型声明
let a: 10;
a = 10;

// 可以使用 | 来连接多个类型(联合类型)
let b: 'male' | 'female';
b = 'male';
b = 'female';

let c: boolean | string;
c = true;
c = 'hello';


// any 
// 表示任意类型，一个变量设置类型为any后相当于对该变量关闭了TS类型的检测 --显性声明
// 使用TS不建议使用 any 
let d: any;
d = 10;
d = 'hello';
d = null;
d = true;

// 如果声明变量不指定类型，则 TS 解析器 自动判断类型为any --隐性声明
let p;
p = true;
p = 10;


//  unknown 表示未知类型的值
let e: unknown;
e = 10;
e = 'hello';
e = true;

// 示例 any与unknown的区别
let s: string;
// d的类型是any，它可以赋值给任意变量 不会报错
// s = d;

e = 'hello';
// 不能直接将 unknown 赋值
// s = e;

// unknown 实际上就是一个类型安全的any
// unknown类型的变量，不能直接赋值给其他变量
// 方法一
if (typeof e === 'string') {
    s = e;
}
/**
 * 语法
 * 变量 as 类型
 * <类型>变量
*/
// 方法二  类型断言 可以用来告诉解析器变量的实际类型
s = e as string;
s = <string>e;



// 函数返回值
// voild 用来表示空，以函数为例，就表示没有返回值的函数
function fn(): void {
    return undefined;
    // return null;
    // return 
}
// never 表示永远不会返回结果
function fn2(): never {
    throw new Error('报错了');
}